package Datatypes;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Archivo implements Serializable{
    
    private File archivo = null;
    private FileWriter fw = null;
    private BufferedWriter bw = null;
    private FileReader fr = null;
    private BufferedReader br = null;
    private FileOutputStream fos = null;
    private ObjectOutputStream oos = null;
    private FileInputStream fis = null;
    private ObjectInputStream ois = null;
    private byte[] archivoBytes = null;
    private String nombreArchivo = null;

    public Archivo() {}
    
    public Archivo(File archivo){
    
        this.archivo = archivo;
        this.nombreArchivo = archivo.getName();
            
    }

    public File getArchivo() { return archivo; }
    public void setArchivo(File archivo) { this.archivo = archivo; }    
    public byte[] getArchivoBytes() { return archivoBytes; }
    public void setArchivoBytes(byte[] archivoBytes) { this.archivoBytes = archivoBytes; }
    public String getNombreArchivo() { return nombreArchivo; }
    public void setNombreArchivo(String nombreArchivo) { this.nombreArchivo = nombreArchivo; }
       
    public Object leerObjetoDeArchivo() throws Exception{
    
        Object objeto = null;
        
        try{
            
            fis = new FileInputStream(archivo);
            ois = new ObjectInputStream(fis);
            objeto = ois.readObject();
            ois.close();
            fis.close();
    
        }
        
        catch(IOException | ClassNotFoundException e){
        
            throw e;
        
        }
        
        return objeto;
            
    }
    
    public void escribirObjetoEnArchivo(Object objeto) throws Exception{
    
        try{
            
            fos = new FileOutputStream(archivo);
            oos = new ObjectOutputStream(fos);
            oos.writeObject(objeto);
            oos.close();
            fos.close();
    
        }
        
        catch(IOException e){
        
            throw e;
        
        }
            
    }
    
    public String leerArchivo() throws Exception{
    
        String texto = new String();
        
        try{
            
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);
            
            String linea;
            
            while((linea = br.readLine()) != null){
            
                texto = texto + linea + "\n";
            
            }
            
            br.close();
            fr.close();
    
        }
        
        catch(IOException e){
        
            throw e;
        
        }
        
        return texto;
            
    }
    
    public void escribirArchivo(String buffer, Boolean nosobreescribir) throws Exception{
    
        try{
            
            bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(archivo, nosobreescribir), "UTF8"));
            
            bw.write(buffer);
            bw.newLine();
            
            bw.close();
    
        }
        
        catch(IOException e){
        
            throw e;
        
        }
            
    }
    
    public List<String> leerArchivoEnLista() throws Exception{
    
        List<String> texto = new ArrayList();
        
        try{
            
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);
            
            String linea;
            
            while((linea = br.readLine()) != null){
            
                texto.add(linea);
            
            }
            
            br.close();
            fr.close();
    
        }
        
        catch(IOException e){
        
            throw e;
            
        }
        
        return texto;
            
    }
    
    public byte [] fileToBytes(File archivo) throws Exception{
    
        byte [] archivoB = null;
        
        if((archivo != null) && (archivo.exists())){
        
            archivoB = new byte[(int)archivo.length()];

            try{

                fis = new FileInputStream(archivo);                        
                fis.read(archivoB);
                fis.close();

            }

            catch(IOException e){

                throw e;

            }
            
        }

        else{
        
            throw new Exception("El archivo no existe!");
        
        }
        
        return archivoB;
        
    }
    
    public byte [] toBytes() throws Exception{
            
        if((archivo != null) && (archivo.exists())){
        
            archivoBytes = new byte[(int)archivo.length()];

            try{

                fis = new FileInputStream(archivo);                        
                fis.read(archivoBytes);
                fis.close();

            }

            catch(IOException e){

                throw e;

            }
            
        }

        else{
        
            throw new Exception("El archivo no existe!");
        
        }
        
        return this.archivoBytes;
        
    }
    
    public void guardarImagen(String base64Code, String path) throws Exception{
    
        byte [] imagen = Base64.decode(base64Code);

        File f = new File(path.substring(0, path.lastIndexOf(File.separatorChar)));
        f.mkdirs();        
        f = new File(path);

        fos = new FileOutputStream(f);

        fos.write(imagen);

        fos.close();
    
    }
    
}